/**
 *  CloudEdit- Editor colaborativo peer-to-peer
 *  Author: Miguel Souto Bartolomé
 *  Web: http://code.google.com/p/cloudedit/
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.google.gwt.cloudedit.server;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import com.google.gwt.cloudedit.shared.DatosArchivo;

import easypastry.cast.CastHandler;
import easypastry.core.PastryKernel;

/**
 * La Clase GestionMensajes se encarga de levantar un servicio de notificación
 * Cast en una red Pastry de tabla Hash distribuida. Adicionalmente se encarga
 * de suscribir al nodo a un grupo de distribución, de enviar mensajes a ese
 * grupo y de leer los mensajes recibidos del mismo por el MensajesListener
 * asociado.
 * 
 * @author Miguel Souto Bartolomé
 * @version 4.0
 */
public class GestionMensajes {

	/** El gestor del servicio CAST. */
	private CastHandler cast;

	/**
	 * Grupo al cual el nodo está suscrito.
	 */
	private String subject;

	/**
	 * Instancia un nuevo gestor de mensajes.
	 * 
	 * @param subject grupo de distribución
	 * @param contexto contexto del Servlet
	 */
	public GestionMensajes(String subject, ServletContext contexto) {
		cast = PastryKernel.getCastHandler();
		cast.subscribe(subject);
		cast.addDeliverListener(subject, new MensajesListener(contexto));
		this.subject = subject;
	}

	/**
	 * Envia un mensaje codificado en XML desde una sesión HTTP de cliente 
	 * a todos los nodos suscritos al grupo de distribución "subject" acerca
	 * del archivo pasado por parámetro
	 *
	 * @param xml el mensaje
	 * @param file el archivo relacionado con el mensaje
	 * @param peticion la petición HTTP del cliente
	 */
	public void enviaMensaje(String xml, DatosArchivo file,
			HttpServletRequest peticion) {
		DatosMensaje mensaje = new DatosMensaje(subject, file.getId(), xml,
				peticion.getSession().getId());
		cast.sendMulticast(subject, mensaje);
		System.out.println(mensaje.getSesion() + " notifica que ha guardado "
				+ file.getName());
	}

	/**
	 * Devuelve el ultimo mensaje codificado en XML recibido por el
	 * MensajeListener asociado, el cual está guardado en el contexto de la sesión
	 * del cliente, y lo sobreescribe con el mensaje "<accion>continuar</accion>".
	 * En caso de que no hubiera un mensaje en el Servlet devuelve
	 * "<accion>continuar</accion>".
	 *
	 * @param sesion la sesión
	 * @return el mensaje guardado
	 * @throws Exception the exception
	 */
	public String recibeMensaje(HttpSession sesion) throws Exception {

		try {
			sesion.setAttribute("accion", ((DatosMensaje) sesion.getAttribute("mensaje")).getXML());
			((DatosMensaje) sesion.getAttribute("mensaje")).setXML("<accion>continuar</accion>");
			return (String) (sesion.getAttribute("accion"));
		} catch (Exception e) {
			return ("<accion>continuar</accion>");

		}

	}
}